package com.yun.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Hex;

/**
 * Created by Administrator on 2018/6/2.
 */
public class MD5Util {

	/**
	 * 生成MD5加盐的密码
	 */
	public static String generate(String password) {
		StringBuilder sb = new StringBuilder(16);
		int len = sb.length();
		if (len < 16) {
			for (int i = 0; i < 16 - len; i++) {
				sb.append("0");
			}
		}
		String salt = sb.toString();
		password = md5Hex(password + salt);
		char[] cs = new char[48];
		for (int i = 0; i < 48; i += 3) {
			cs[i] = password.charAt(i / 3 * 2);
			char c = salt.charAt(i / 3);
			cs[i + 1] = c;
			cs[i + 2] = password.charAt(i / 3 * 2 + 1);
		}
		return new String(cs);
	}

	
	
	/**
	 * 获取十六进制字符串形式的MD5摘要
	 */
	public static String md5Hex(String src) {
		try {
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			byte[] bs = md5.digest(src.getBytes());
			return new String(new Hex().encode(bs));
		} catch (Exception e) {
			return null;
		}
	}
	
	
	 public static String getPwd(String pwd) {
		        try {
		            // 创建加密对象
		            MessageDigest digest = MessageDigest.getInstance("md5");
		
		            // 调用加密对象的方法，加密的动作已经完成
		            byte[] bs = digest.digest(pwd.getBytes());
		            // 接下来，我们要对加密后的结果，进行优化，按照mysql的优化思路走
		            // mysql的优化思路：
		            // 第一步，将数据全部转换成正数：
		            String hexString = "";
		            for (byte b : bs) {
		                // 第一步，将数据全部转换成正数：
		                // 解释：为什么采用b&255
		                /*
		                 * b:它本来是一个byte类型的数据(1个字节) 255：是一个int类型的数据(4个字节)
		                 * byte类型的数据与int类型的数据进行运算，会自动类型提升为int类型 eg: b: 1001 1100(原始数据)
		                 * 运算时： b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000
		                 * 0000 0000 0000 0000 0000 1111 1111 结果：0000 0000 0000 0000
		                 * 0000 0000 1001 1100 此时的temp是一个int类型的整数
		                 */
		                int temp = b & 255;
		                // 第二步，将所有的数据转换成16进制的形式
		                // 注意：转换的时候注意if正数>=0&&<16，那么如果使用Integer.toHexString()，可能会造成缺少位数
		                // 因此，需要对temp进行判断
		                if (temp < 16 && temp >= 0) {
		                    // 手动补上一个“0”
		                    hexString = hexString + "0" + Integer.toHexString(temp);
		                } else {
		                    hexString = hexString + Integer.toHexString(temp);
		                }
		            }
		            return hexString;
		        } catch (NoSuchAlgorithmException e) {
		            // TODO Auto-generated catch block
		            e.printStackTrace();
		        }
		        return "";
		    }
		
	
	public static void main(String[] args) {
		System.out.println(MD5Util.generate("123456abc"));
	}

}
